/*
 * recomendador.c
 *
 *  Created on: 04/09/2011
 *      Author: guido
 */

#include "recomendador.h"
#include "operacion.h"
#include "usuario.h"
#include "constantes.h"
#include "mensajes.h"
#include <stdio.h>

void Recomendador_init(Recomendador* r) {
	r->grafo = malloc(sizeof(Grafo));
	Grafo_init(r->grafo);
}

void Recomendador_start(Recomendador* r) {
	Operacion operacion;
	char buffer[MAX_ENTRADA];
	fgets(buffer, MAX_ENTRADA, stdin);
	int salir = 0;
	while ( !salir ) {
		Op_cargarLinea(&operacion, buffer);
		char* paramUno = operacion.parametros[0];
		char* paramDos = operacion.parametros[1];
		char* paramTres = operacion.parametros[2];
		switch (operacion.identificador) {
		case SIMBOLO_AGREGAR:
			Recomendador_agregarUsuario(r, paramUno, paramDos, paramTres);
			break;
		case SIMBOLO_REMOVER:
			Recomendador_removerUsuario(r, paramUno);
			break;
		case SIMBOLO_AMIGAR:
			Recomendador_amigar(r, paramUno, paramDos);
			break;
		case SIMBOLO_DESAMIGAR:
			Recomendador_desamigar(r, paramUno, paramDos);
			break;
		case SIMBOLO_RECOMENDAR:
			Recomendador_recomendar(r, paramUno);
			break;
		case SIMBOLO_SALIR:
			salir = 1;
			Msg_OK(operacion.identificador);
		}
		fgets(buffer, MAX_ENTRADA, stdin);
	}
}

void Recomendador_agregarUsuario(Recomendador* r, char* numero,
		char* apellido, char* nombre) {
	int codigo = Grafo_agregarUsuario(r->grafo, numero, apellido, nombre);
	switch (codigo) {
	case COD_OK:
		Msg_OK(SIMBOLO_AGREGAR);
		break;
	case COD_YA_EXISTE:
		Error_usuarioYaExiste(numero);
		break;
	}
}

void Recomendador_removerUsuario(Recomendador* r, char* numero) {
	int codigo = Grafo_removerUsuario(r->grafo, numero);
	switch (codigo) {
	case COD_OK:
		Msg_OK(SIMBOLO_REMOVER);
		break;
	case COD_NO_EXISTE:
		Error_usuarioNoExiste(numero);
		break;
	}
}

void Recomendador_amigar(Recomendador* r, char* numUsuario, char* numAmigo) {
	int codigo = Grafo_amigar(r->grafo, numUsuario, numAmigo);
	switch (codigo) {
	case COD_OK:
		Msg_OK(SIMBOLO_AMIGAR);
		break;
	case COD_NO_EXISTE:
		Error_usuarioNoExiste(numUsuario);
		break;
	case COD_AMIGO_NO_EXISTE:
		Error_usuarioNoExiste(numAmigo);
		break;
	case COD_YA_SON_AMIGOS:
		Error_yaSonAmigos(numUsuario, numAmigo);
	}
}

void Recomendador_desamigar(Recomendador* r, char* numUsuario, char* numAmigo) {
	int codigo = Grafo_desamigar(r->grafo, numUsuario, numAmigo);
	switch (codigo) {
	case COD_OK:
		Msg_OK(SIMBOLO_DESAMIGAR);
		break;
	case COD_NO_EXISTE:
		Error_usuarioNoExiste(numUsuario);
		break;
	case COD_AMIGO_NO_EXISTE:
		Error_usuarioNoExiste(numAmigo);
		break;
	case COD_NO_SON_AMIGOS:
		Error_noSonAmigos(numUsuario, numAmigo);
	}
}

void Recomendador_recomendar(Recomendador* r, char* numero) {
	Lista lista;
	Lista_init(&lista);
	Usuario* usuario = Grafo_getUsuario(r->grafo, numero);
	int codigo = Grafo_listaDeAmigosPosibles(r->grafo, numero, &lista);
	switch (codigo) {
	case COD_OK:
		Msg_listarPosiblesAmigos(usuario, &lista);
		break;
	case COD_NO_EXISTE:
		Error_usuarioNoExiste(numero);
		break;
	case COD_NO_HAY_RECOMENDACIONES:
		Error_usuarioSinRecomendaciones(numero);
		break;
	}
	Lista_destroy(&lista);
}

void Recomendador_destroy(Recomendador* r) {
	Grafo_destroy(r->grafo);
	free(r->grafo);
}
